package com.holiday.spring.proxy.dynamic;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;

/**
 * JDK动态代理
 * 1、自定义类并实现InvocationHandler类
 * 2、创建方法：newProxyInstance，这个方法的作用是：将目标类与代理类绑定关系
 *      1、Proxy.newProxyInstance
 *          1、第一个参数是：目标类的加载器
 *          2、第二个参数是：目标类的实现接口
 *          3、第三个参数是：目标类实现的方法
 * 3、实现方法：invoke
 *      1、Object proxy：在代理的类
 *      2、Method method：代理类中的方法
 *      3、Object[] args：代理类中方法的参数
 */
public class JdkProxy implements InvocationHandler {

    private Object targetObject;

    /**
     * 这个方法的作用是将目标类与代理类绑定关系
     *
     * @param targetObject
     * @return
     */
    public Object newProxyInstance(Object targetObject) throws Exception {
        this.targetObject = targetObject;
        /**
         * 1、第一个参数是：目标类的加载器
         * 2、第二个参数是：目标类的实现接口
         * 3、第三个参数是：目标类实现的方法
         */
        Object o = Proxy.newProxyInstance(targetObject.getClass().getClassLoader(),
                targetObject.getClass().getInterfaces(), this);
        return o;
    }

    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        /**
         * 通过个方法进行动态代理调用目标类中方法
         */
        Object result = null;
        result = method.invoke(targetObject, args);
        return result;
    }

}
